from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List, Optional

mcp = FastMCP("Vamp Plugin SDK MCP Server")
"""
面向 vamp-plugin-sdk 软件的 MCP Server

所有 MCP tool 列表：
1. vamp_list_by_category: 列出按类别分类的插件索引
   参数：无
   返回：命令执行结果 JSON

2. vamp_list_full: 列出所有数据报告
   参数：无
   返回：命令执行结果 JSON

3. vamp_list_ids: 列出插件路径中的插件信息
   参数：无
   返回：命令执行结果 JSON

4. vamp_list_outputs: 列出所有插件的输出信息
   参数：无
   返回：命令执行结果 JSON

5. vamp_list: 列出插件库和 Vamp 插件
   参数：无
   返回：命令执行结果 JSON

6. vamp_list_short: 列出插件库和 Vamp 插件（短格式）
   参数：无
   返回：命令执行结果 JSON

7. vamp_print_path: 打印 Vamp 库的搜索路径
   参数：无
   返回：命令执行结果 JSON

8. vamp_version: 显示版本信息
   参数：无
   返回：命令执行结果 JSON

9. vamp_rdf_template_generator: 生成 RDF 模板
   参数：
     - base_uri: 基础 URI（可选）
     - sonames: 插件库名称列表（可选）
     - mapping_uri: 映射 URI（可选）
     - plugin_identifier: 插件标识符（可选）
   返回：命令执行结果 JSON

所有 tool 返回统一 JSON 结构：
{
  "success": bool,
  "command": str,
  "exit_code": int,
  "stdout": str,
  "stderr": str
}
"""


def run_command(command: List[str]) -> dict:
    """执行命令行命令并返回统一格式的结果"""
    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True,
            timeout=30
        )
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out after 30 seconds"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }


@mcp.tool()
def vamp_list_by_category() -> dict:
    """
    列出按类别分类的插件索引（机器可读格式）
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "--list-by-category"])


@mcp.tool()
def vamp_list_full() -> dict:
    """
    列出所有数据报告
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "--list-full"])


@mcp.tool()
def vamp_list_ids() -> dict:
    """
    列出插件路径中的插件信息
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "--list-ids"])


@mcp.tool()
def vamp_list_outputs() -> dict:
    """
    列出所有插件的输出信息
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "--list-outputs"])


@mcp.tool()
def vamp_list() -> dict:
    """
    列出插件库和 Vamp 插件
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "--list"])


@mcp.tool()
def vamp_list_short() -> dict:
    """
    列出插件库和 Vamp 插件（短格式）
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "-l"])


@mcp.tool()
def vamp_print_path() -> dict:
    """
    打印 Vamp 库的搜索路径
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "-p"])


@mcp.tool()
def vamp_version() -> dict:
    """
    显示版本信息
    
    返回：命令执行结果 JSON
    """
    return run_command(["vamp-simple-host", "-v"])


@mcp.tool()
def vamp_rdf_template_generator(
    base_uri: Optional[str] = None,
    sonames: Optional[List[str]] = None,
    mapping_uri: Optional[str] = None,
    plugin_identifier: Optional[str] = None
) -> dict:
    """
    生成 RDF 模板
    
    参数：
      - base_uri: 基础 URI（可选）
      - sonames: 插件库名称列表（可选）
      - mapping_uri: 映射 URI（可选）
      - plugin_identifier: 插件标识符（可选）
    
    返回：命令执行结果 JSON
    """
    command = ["vamp-rdf-template-generator"]
    
    if base_uri:
        command.append(base_uri)
    
    if mapping_uri:
        command.extend(["-m", mapping_uri])
    
    if plugin_identifier:
        command.extend(["-i", plugin_identifier])
    
    if sonames:
        command.extend(sonames)
    
    return run_command(command)


if __name__ == "__main__":
    mcp.run()